xref: /petsc/src/ksp/pc/impls/spai/dspai.c (revision 6c2b77d522d8aa5c8b27f04fddd7150d0d6755fb)
1 
2 #include <petscmat.h>
3 #include <petsc/private/petscimpl.h>
4 
5 /*
6      MatDumpSPAI - Dumps a PETSc matrix to a file in an ASCII format
7   suitable for the SPAI code of Stephen Barnard to solve. This routine
8   is simply here to allow testing of matrices directly with the SPAI
9   code, rather then through the PETSc interface.
10 
11 */
12 PetscErrorCode MatDumpSPAI(Mat A, FILE *file)
13 {
14   const PetscScalar *vals;
15   int                i, j, n, size, nz;
16   const int         *cols;
17   MPI_Comm           comm;
18 
19   PetscFunctionBegin;
20   PetscObjectGetComm((PetscObject)A, &comm);
21   MPI_Comm_size(comm, &size);
22   PetscCheck(size == 1, PetscObjectComm((PetscObject)A), PETSC_ERR_SUP, "Only single processor dumps");
23   PetscCall(MatGetSize(A, &n, &n));
24   /* print the matrix */
25   fprintf(file, "%d\n", n);
26   for (i = 0; i < n; i++) {
27     PetscCall(MatGetRow(A, i, &nz, &cols, &vals));
28     for (j = 0; j < nz; j++) fprintf(file, "%d %d %16.14e\n", i + 1, cols[j] + 1, vals[j]);
29     PetscCall(MatRestoreRow(A, i, &nz, &cols, &vals));
30   }
31   PetscFunctionReturn(0);
32 }
33 
34 PetscErrorCode VecDumpSPAI(Vec b, FILE *file)
35 {
36   int          n, i;
37   PetscScalar *array;
38 
39   PetscFunctionBegin;
40   PetscCall(VecGetSize(b, &n));
41   PetscCall(VecGetArray(b, &array));
42   fprintf(file, "%d\n", n);
43   for (i = 0; i < n; i++) fprintf(file, "%d %16.14e\n", i + 1, array[i]);
44   PetscFunctionReturn(0);
45 }
46