Actual source code: ex31.c
2: static char help[] = "Tests binary I/O of matrices and illustrates user-defined event logging.\n\n";
4: #include <petscmat.h>
6: /* Note: Most applications would not read and write the same matrix within
7: the same program. This example is intended only to demonstrate
8: both input and output. */
10: int main(int argc, char **args)
11: {
12: Mat C;
13: PetscScalar v;
14: PetscInt i, j, Ii, J, Istart, Iend, N, m = 4, n = 4;
15: PetscMPIInt rank, size;
16: PetscViewer viewer;
17: #if defined(PETSC_USE_LOG)
18: PetscLogEvent MATRIX_GENERATE, MATRIX_READ;
19: #endif
21: PetscFunctionBeginUser;
22: PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
23: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
24: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
25: PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
26: PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
27: N = m * n;
29: /* PART 1: Generate matrix, then write it in binary format */
31: PetscCall(PetscLogEventRegister("Generate Matrix", 0, &MATRIX_GENERATE));
32: PetscCall(PetscLogEventBegin(MATRIX_GENERATE, 0, 0, 0, 0));
34: /* Generate matrix */
35: PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
36: PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, N, N));
37: PetscCall(MatSetFromOptions(C));
38: PetscCall(MatSetUp(C));
39: PetscCall(MatGetOwnershipRange(C, &Istart, &Iend));
40: for (Ii = Istart; Ii < Iend; Ii++) {
41: v = -1.0;
42: i = Ii / n;
43: j = Ii - i * n;
44: if (i > 0) {
45: J = Ii - n;
46: PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
47: }
48: if (i < m - 1) {
49: J = Ii + n;
50: PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
51: }
52: if (j > 0) {
53: J = Ii - 1;
54: PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
55: }
56: if (j < n - 1) {
57: J = Ii + 1;
58: PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
59: }
60: v = 4.0;
61: PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES));
62: }
63: PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
64: PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
65: PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD));
67: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "writing matrix in binary to matrix.dat ...\n"));
68: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_WRITE, &viewer));
69: PetscCall(MatView(C, viewer));
70: PetscCall(PetscViewerDestroy(&viewer));
71: PetscCall(MatDestroy(&C));
72: PetscCall(PetscLogEventEnd(MATRIX_GENERATE, 0, 0, 0, 0));
74: /* PART 2: Read in matrix in binary format */
76: /* All processors wait until test matrix has been dumped */
77: PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
79: PetscCall(PetscLogEventRegister("Read Matrix", 0, &MATRIX_READ));
80: PetscCall(PetscLogEventBegin(MATRIX_READ, 0, 0, 0, 0));
81: PetscCall(PetscPrintf(PETSC_COMM_WORLD, "reading matrix in binary from matrix.dat ...\n"));
82: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_READ, &viewer));
83: PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
84: PetscCall(MatLoad(C, viewer));
85: PetscCall(PetscViewerDestroy(&viewer));
86: PetscCall(PetscLogEventEnd(MATRIX_READ, 0, 0, 0, 0));
87: PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD));
89: /* Free data structures */
90: PetscCall(MatDestroy(&C));
92: PetscCall(PetscFinalize());
93: return 0;
94: }
96: /*TEST
98: test:
99: filter: grep -v " MPI process"
101: TEST*/