xref: /petsc/src/ksp/pc/impls/spai/dspai.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
101a81e61SBarry Smith 
2c6db04a5SJed Brown #include <petscmat.h>
3af0996ceSBarry Smith #include <petsc/private/petscimpl.h>
401a81e61SBarry Smith 
501a81e61SBarry Smith /*
601a81e61SBarry Smith      MatDumpSPAI - Dumps a PETSc matrix to a file in an ASCII format
701a81e61SBarry Smith   suitable for the SPAI code of Stephen Barnard to solve. This routine
801a81e61SBarry Smith   is simply here to allow testing of matrices directly with the SPAI
901a81e61SBarry Smith   code, rather then through the PETSc interface.
1001a81e61SBarry Smith 
1101a81e61SBarry Smith */
12d71ae5a4SJacob Faibussowitsch PetscErrorCode MatDumpSPAI(Mat A, FILE *file)
13d71ae5a4SJacob Faibussowitsch {
14*3ba16761SJacob Faibussowitsch   PetscMPIInt size;
15*3ba16761SJacob Faibussowitsch   PetscInt    n;
1601a81e61SBarry Smith   MPI_Comm    comm;
1701a81e61SBarry Smith 
185f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
19*3ba16761SJacob Faibussowitsch   PetscValidHeaderSpecific(A, MAT_CLASSID, 1);
20*3ba16761SJacob Faibussowitsch   PetscValidPointer(file, 2);
21*3ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)A, &comm));
22*3ba16761SJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
23*3ba16761SJacob Faibussowitsch   PetscCheck(size == 1, comm, PETSC_ERR_SUP, "Only single processor dumps");
249566063dSJacob Faibussowitsch   PetscCall(MatGetSize(A, &n, &n));
2501a81e61SBarry Smith   /* print the matrix */
26*3ba16761SJacob Faibussowitsch   fprintf(file, "%" PetscInt_FMT "\n", n);
27*3ba16761SJacob Faibussowitsch   for (PetscInt i = 0; i < n; i++) {
28*3ba16761SJacob Faibussowitsch     const PetscInt    *cols;
29*3ba16761SJacob Faibussowitsch     const PetscScalar *vals;
30*3ba16761SJacob Faibussowitsch     PetscInt           nz;
31*3ba16761SJacob Faibussowitsch 
329566063dSJacob Faibussowitsch     PetscCall(MatGetRow(A, i, &nz, &cols, &vals));
33*3ba16761SJacob Faibussowitsch     for (PetscInt j = 0; j < nz; j++) fprintf(file, "%" PetscInt_FMT " %d" PetscInt_FMT " %16.14e\n", i + 1, cols[j] + 1, vals[j]);
349566063dSJacob Faibussowitsch     PetscCall(MatRestoreRow(A, i, &nz, &cols, &vals));
3501a81e61SBarry Smith   }
36*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3701a81e61SBarry Smith }
3801a81e61SBarry Smith 
39d71ae5a4SJacob Faibussowitsch PetscErrorCode VecDumpSPAI(Vec b, FILE *file)
40d71ae5a4SJacob Faibussowitsch {
41*3ba16761SJacob Faibussowitsch   PetscInt           n;
42*3ba16761SJacob Faibussowitsch   const PetscScalar *array;
4301a81e61SBarry Smith 
445f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
45*3ba16761SJacob Faibussowitsch   PetscValidHeaderSpecific(b, VEC_CLASSID, 1);
46*3ba16761SJacob Faibussowitsch   PetscValidPointer(file, 2);
479566063dSJacob Faibussowitsch   PetscCall(VecGetSize(b, &n));
48*3ba16761SJacob Faibussowitsch   PetscCall(VecGetArrayRead(b, &array));
49*3ba16761SJacob Faibussowitsch   fprintf(file, "%" PetscInt_FMT "\n", n);
50*3ba16761SJacob Faibussowitsch   for (PetscInt i = 0; i < n; i++) fprintf(file, "%" PetscInt_FMT " %16.14e\n", i + 1, array[i]);
51*3ba16761SJacob Faibussowitsch   PetscCall(VecRestoreArrayRead(b, &array));
52*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5301a81e61SBarry Smith }
54