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