xref: /petsc/src/mat/tests/ex31.c (revision d5b43468fb8780a8feea140ccd6fa3e6a50411cc)
1 
2 static char help[] = "Tests binary I/O of matrices and illustrates user-defined event logging.\n\n";
3 
4 #include <petscmat.h>
5 
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. */
9 
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
20 
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;
28 
29   /* PART 1:  Generate matrix, then write it in binary format */
30 
31   PetscCall(PetscLogEventRegister("Generate Matrix", 0, &MATRIX_GENERATE));
32   PetscCall(PetscLogEventBegin(MATRIX_GENERATE, 0, 0, 0, 0));
33 
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));
66 
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));
73 
74   /* PART 2:  Read in matrix in binary format */
75 
76   /* All processors wait until test matrix has been dumped */
77   PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
78 
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));
88 
89   /* Free data structures */
90   PetscCall(MatDestroy(&C));
91 
92   PetscCall(PetscFinalize());
93   return 0;
94 }
95 
96 /*TEST
97 
98    test:
99       filter: grep -v " MPI process"
100 
101 TEST*/
102