xref: /petsc/src/mat/tests/ex31.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests binary I/O of matrices and illustrates user-defined event logging.\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown /* Note:  Most applications would not read and write the same matrix within
7c4762a1bSJed Brown   the same program.  This example is intended only to demonstrate
8c4762a1bSJed Brown   both input and output. */
9c4762a1bSJed Brown 
10*d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
11*d71ae5a4SJacob Faibussowitsch {
12c4762a1bSJed Brown   Mat         C;
13c4762a1bSJed Brown   PetscScalar v;
14c4762a1bSJed Brown   PetscInt    i, j, Ii, J, Istart, Iend, N, m = 4, n = 4;
15c4762a1bSJed Brown   PetscMPIInt rank, size;
16c4762a1bSJed Brown   PetscViewer viewer;
17c4762a1bSJed Brown #if defined(PETSC_USE_LOG)
18c4762a1bSJed Brown   PetscLogEvent MATRIX_GENERATE, MATRIX_READ;
19c4762a1bSJed Brown #endif
20c4762a1bSJed Brown 
21327415f7SBarry Smith   PetscFunctionBeginUser;
229566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
239566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
249566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
259566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
27c4762a1bSJed Brown   N = m * n;
28c4762a1bSJed Brown 
29c4762a1bSJed Brown   /* PART 1:  Generate matrix, then write it in binary format */
30c4762a1bSJed Brown 
319566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("Generate Matrix", 0, &MATRIX_GENERATE));
329566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(MATRIX_GENERATE, 0, 0, 0, 0));
33c4762a1bSJed Brown 
34c4762a1bSJed Brown   /* Generate matrix */
359566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
369566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, N, N));
379566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(C));
389566063dSJacob Faibussowitsch   PetscCall(MatSetUp(C));
399566063dSJacob Faibussowitsch   PetscCall(MatGetOwnershipRange(C, &Istart, &Iend));
40c4762a1bSJed Brown   for (Ii = Istart; Ii < Iend; Ii++) {
419371c9d4SSatish Balay     v = -1.0;
429371c9d4SSatish Balay     i = Ii / n;
439371c9d4SSatish Balay     j = Ii - i * n;
449371c9d4SSatish Balay     if (i > 0) {
459371c9d4SSatish Balay       J = Ii - n;
469371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
479371c9d4SSatish Balay     }
489371c9d4SSatish Balay     if (i < m - 1) {
499371c9d4SSatish Balay       J = Ii + n;
509371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
519371c9d4SSatish Balay     }
529371c9d4SSatish Balay     if (j > 0) {
539371c9d4SSatish Balay       J = Ii - 1;
549371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
559371c9d4SSatish Balay     }
569371c9d4SSatish Balay     if (j < n - 1) {
579371c9d4SSatish Balay       J = Ii + 1;
589371c9d4SSatish Balay       PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES));
599371c9d4SSatish Balay     }
609371c9d4SSatish Balay     v = 4.0;
619371c9d4SSatish Balay     PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES));
62c4762a1bSJed Brown   }
639566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
649566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
659566063dSJacob Faibussowitsch   PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD));
66c4762a1bSJed Brown 
679566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "writing matrix in binary to matrix.dat ...\n"));
689566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_WRITE, &viewer));
699566063dSJacob Faibussowitsch   PetscCall(MatView(C, viewer));
709566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&viewer));
719566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&C));
729566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(MATRIX_GENERATE, 0, 0, 0, 0));
73c4762a1bSJed Brown 
74c4762a1bSJed Brown   /* PART 2:  Read in matrix in binary format */
75c4762a1bSJed Brown 
76c4762a1bSJed Brown   /* All processors wait until test matrix has been dumped */
779566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
78c4762a1bSJed Brown 
799566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("Read Matrix", 0, &MATRIX_READ));
809566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(MATRIX_READ, 0, 0, 0, 0));
819566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "reading matrix in binary from matrix.dat ...\n"));
829566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_READ, &viewer));
839566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
849566063dSJacob Faibussowitsch   PetscCall(MatLoad(C, viewer));
859566063dSJacob Faibussowitsch   PetscCall(PetscViewerDestroy(&viewer));
869566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(MATRIX_READ, 0, 0, 0, 0));
879566063dSJacob Faibussowitsch   PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD));
88c4762a1bSJed Brown 
89c4762a1bSJed Brown   /* Free data structures */
909566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&C));
91c4762a1bSJed Brown 
929566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
93b122ec5aSJacob Faibussowitsch   return 0;
94c4762a1bSJed Brown }
95c4762a1bSJed Brown 
96c4762a1bSJed Brown /*TEST
97c4762a1bSJed Brown 
98c4762a1bSJed Brown    test:
998cc725e6SPierre Jolivet       filter: grep -v " MPI process"
100c4762a1bSJed Brown 
101c4762a1bSJed Brown TEST*/
102