Actual source code: ex72.c
1: static char help[] = "Read a non-complex sparse matrix from a Matrix Market (v. 2.0) file\n\
2: and write it to a file in petsc sparse binary format. If the matrix is symmetric, the binary file is in \n\
3: PETSc MATSBAIJ format, otherwise it is in MATAIJ format \n\
4: Usage: ./ex72 -fin <infile> -fout <outfile> \n\
5: (See https://math.nist.gov/MatrixMarket/ for details.)\n\
6: The option -permute <natural,rcm,nd,...> permutes the matrix using the ordering type.\n\
7: The option -aij_only allows to use MATAIJ for all cases.\n\\n";
9: /*
10: NOTES:
12: 1) Matrix Market files are always 1-based, i.e. the index of the first
13: element of a matrix is (1,1), not (0,0) as in C. ADJUST THESE
14: OFFSETS ACCORDINGLY offsets accordingly when reading and writing
15: to files.
17: 2) ANSI C requires one to use the "l" format modifier when reading
18: double precision floating point numbers in scanf() and
19: its variants. For example, use "%lf", "%lg", or "%le"
20: when reading doubles, otherwise errors will occur.
21: */
22: #include <petscmat.h>
23: #include "mmloader.h"
25: int main(int argc, char **argv)
26: {
27: MM_typecode matcode;
28: FILE *file;
29: PetscInt M, N, nz;
30: Mat A;
31: char filein[PETSC_MAX_PATH_LEN], fileout[PETSC_MAX_PATH_LEN];
32: char ordering[256] = MATORDERINGRCM;
33: PetscViewer view;
34: PetscBool flag, symmetric = PETSC_FALSE, aijonly = PETSC_FALSE, permute = PETSC_FALSE;
35: IS rowperm = NULL, colperm = NULL;
36: PetscMPIInt size;
38: PetscFunctionBeginUser;
39: PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
40: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
41: PetscCheck(size == 1, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "This is a uniprocessor example only!");
43: PetscOptionsBegin(PETSC_COMM_WORLD, NULL, "Matrix Market example options", "");
44: {
45: PetscCall(PetscOptionsString("-fin", "Input Matrix Market file", "", filein, filein, sizeof(filein), &flag));
46: PetscCheck(flag, PETSC_COMM_SELF, PETSC_ERR_USER_INPUT, "Please use -fin <filename> to specify the input file name!");
47: PetscCall(PetscOptionsString("-fout", "Output file in petsc sparse binary format", "", fileout, fileout, sizeof(fileout), &flag));
48: PetscCheck(flag, PETSC_COMM_SELF, PETSC_ERR_USER_INPUT, "Please use -fout <filename> to specify the output file name!");
49: PetscCall(PetscOptionsBool("-aij_only", "Use MATAIJ for all cases", "", aijonly, &aijonly, NULL));
50: PetscCall(PetscOptionsFList("-permute", "Permute matrix and vector to solving in new ordering", "", MatOrderingList, ordering, ordering, sizeof(ordering), &permute));
51: }
52: PetscOptionsEnd();
54: PetscCall(MatCreateFromMTX(&A, filein, aijonly));
55: PetscCall(PetscFOpen(PETSC_COMM_SELF, filein, "r", &file));
56: PetscCallExternal(mm_read_banner, file, &matcode);
57: if (mm_is_symmetric(matcode)) symmetric = PETSC_TRUE;
58: PetscCallExternal(mm_write_banner, stdout, matcode);
59: PetscCallExternal(mm_read_mtx_crd_size, file, &M, &N, &nz);
60: PetscCall(PetscFClose(PETSC_COMM_SELF, file));
61: PetscCall(PetscPrintf(PETSC_COMM_SELF, "M: %d, N: %d, nnz: %d\n", M, N, nz));
62: PetscCall(PetscPrintf(PETSC_COMM_SELF, "Reading matrix completes.\n"));
63: if (permute) {
64: Mat Aperm;
65: PetscCall(MatGetOrdering(A, ordering, &rowperm, &colperm));
66: PetscCall(MatPermute(A, rowperm, colperm, &Aperm));
67: PetscCall(MatDestroy(&A));
68: A = Aperm; /* Replace original operator with permuted version */
69: }
71: /* Write out matrix */
72: PetscCall(PetscPrintf(PETSC_COMM_SELF, "Writing matrix to binary file %s using PETSc %s format ...\n", fileout, (symmetric && !aijonly) ? "SBAIJ" : "AIJ"));
73: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF, fileout, FILE_MODE_WRITE, &view));
74: PetscCall(MatView(A, view));
75: PetscCall(PetscViewerDestroy(&view));
76: PetscCall(PetscPrintf(PETSC_COMM_SELF, "Writing matrix completes.\n"));
78: PetscCall(MatDestroy(&A));
79: PetscCall(ISDestroy(&rowperm));
80: PetscCall(ISDestroy(&colperm));
81: PetscCall(PetscFinalize());
82: return 0;
83: }
85: /*TEST
87: build:
88: requires: !complex double !defined(PETSC_USE_64BIT_INDICES)
89: depends: mmloader.c mmio.c
91: test:
92: suffix: 1
93: args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/amesos2_test_mat0.mtx -fout petscmat.aij
94: output_file: output/ex72_1.out
96: test:
97: suffix: 2
98: args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/LFAT5.mtx -fout petscmat.sbaij
99: output_file: output/ex72_2.out
101: test:
102: suffix: 3
103: args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/m_05_05_crk.mtx -fout petscmat2.aij
104: output_file: output/ex72_3.out
106: test:
107: suffix: 4
108: args: -fin ${wPETSC_DIR}/share/petsc/datafiles/matrices/amesos2_test_mat0.mtx -fout petscmat.aij -permute rcm
109: output_file: output/ex72_4.out
110: TEST*/